package create.single;

/**
 * @author lzp
 * @Date:2023/2/24
 * @description: 懒汉式 ,使用时才实例化【真正意义上的懒加载】 线程安全版，【双锁】，锁代码块的方式减小了锁的范围，提高效率
 */
public class Singleton5 {

	/**
	 * volatile修饰实例变量，保证多线程调用时即时刷新内存，避免未真正初始化的变量被其他线程使用
	 */
	private static volatile Singleton5 INSTANCE;

	private Singleton5() {
	}

	/**
	 * 双锁  锁代码块
	 */
	public static Singleton5 getInstance() {
		if (INSTANCE == null) {
			synchronized (Singleton5.class) {
				// 有可能两个线程都通过了null判断，此时即时另一个持有锁进行逻辑处理，释放后，另一个线程仍然会走一遍，所以需要再校验一次
				if (INSTANCE == null) {
					synchronized (Singleton5.class) {
						INSTANCE = new Singleton5();
						System.out.println("懒汉式进行实例化啦");
					}
				}
			}
		}
		return INSTANCE;
	}

	/**
	 * 防止序列化破坏单例
	 */
	private Object readResolve() {
		return INSTANCE;
	}

}
